/**
 * 节点间 通信消息
 */
class NodeMsg { 
  /**
   * NodeMsg 构造函数
   * @param actionType 动作类型 默认值 1
   * @param content 内容
   */
  constructor(actionType,content) {
    this.actionType = (actionType != null) ? actionType : 1;
    this.content = content;
    this.timespan = new Date().getTime();
  }

  /**
   * 设置消息对象的 状态码 和 内容
   * @param actionType 状态码
   * @param content 内容
   */
  SetTypeAndContent(actionType, content) { 
    this.actionType = actionType;
    if (content) { 
      this.content = content;
    }
  }

  toJson() { 
    return JSON.stringify(this);
  }

  /**
   * 将 NodeMsg 的 json字符串 转成对象
   * @param nodeMsgJsonStr NodeMsg 的Json字符串
   * @returns NodeMsg 对象
   */
  static json2NodeMsgObj(nodeMsgJsonStr) {
    var jsonObj = null;
    if (this.isNodeMsg(nodeMsgJsonStr)) {
      jsonObj = JSON.parse(nodeMsgJsonStr);
      jsonObj = new NodeMsg(jsonObj.actionType, jsonObj.content,jsonObj.timespan);
    }
    return jsonObj;
  }

  /**
   * 判断 字符串 是否为 NodeMsg 的Json字符串，是否可以转成 WSMsg对象
   * @param {*} msgStr 
   */
  static isNodeMsg(msgStr) {
    var jsonObj = null;
    if (typeof msgStr == 'string') {
      try {
        jsonObj = JSON.parse(msgStr);
      } catch (error) {
        jsonObj = null;
      }
    }
    if (jsonObj && jsonObj.hasOwnProperty && jsonObj.hasOwnProperty('actionType') && jsonObj.hasOwnProperty('content') && jsonObj.hasOwnProperty('timespan')) {
      return true;
    }
    return false;
  }
}

/**
 * 业务 动作 类型
 */
NodeMsg.ActionType = {
  RequestBlockData: 1,// 请求 最新区块链数据
  BroadNewBlockData: 2// 广播 最新一个区块
};

module.exports = NodeMsg;